#ifndef CLIENTHANDLER_H
#define CLIENTHANDLER_H

#include <QObject>
#include <QWebSocket>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include "Server.h"
#include "ConnectionPool.h"
#include <QDebug>

class ClientHandler : public QObject
{
    Q_OBJECT
public:
    ClientHandler(QWebSocket* socket,const QString& id,QObject *parent = nullptr);
    void sendJsonToClient(QJsonObject& jsonObj);
    void sendFriendInfoToClient(QString id);// 发送新朋友的信息给自己的客户端

    // 处理客户端发来的请求
public:
    void dealRegister(const QJsonObject& jsonObj);
    void dealLogin(const QJsonObject& jsonObj);
    void dealFindPwdStep1(const QString& id);// 处理找回密码操作步骤1(检查账号，发送密保问题)
    void dealFindPwdStep2(const QString& id, const QString& safeA);// 处理找回密码操作步骤2（验证答案）
    void dealFindPwdStep3(const QString& id, const QString& pwd);// 处理找回密码操作步骤3（更新密码）
    void dealDeleteAccount();
    void dealMyInfo();// 发送自身的信息给客户端
    void dealFriendInfo();// 发送自身的好友信息给客户端
    void dealFriendRequestList();// 发送自身的未读的好友申请列表信息
    void dealMyUnReadMsg();// 发送自身的未读消息列表信息
    void dealOutOfLogin();
    void dealSearchFriendInfo(QString id);// 发送某个人的信息
    void dealAddFriendRequest(QString id);// 处理申请好友信息请求
    void dealAddFriendAnswer(const QJsonObject& jsonObj);// 处理好友请求（接受或拒绝）
    void dealDeleteAFriend(QString id);// 需要删除某个人
    void dealMsg(const QJsonObject& jsonObj);// 收到客户端的一条聊天信息
    void dealUpdateMyInfo(const QJsonObject& jsonObj);// 收到需要改变个人信息的通知


    // 处理其他服务端的槽函数
    void onFriendRequest(QJsonObject& jsonObj);// 收到添加我的好友请求
    void onIamNewFriend(QString id);// 将系朋友的信息发给客户端
    void onYouAreDelete(QString id);// 我收到通知，已经被它删除了
    void onFriendChangeInfo(QString id);// 得到需要更新一名好友的信息的通知

    // 被其他服务端直接调用的函数（注意线程安全）
    void receiveANewMsg(QString sender, QString type, QString text, QString filename);


public slots:
    void onDisconnected();// 客户端主动断开连接
    void onTextMessageReceived(const QString &message);// 收到来自客户端的消息

    // 给其他服务端发送的信号
signals:
    void friendRequest(QJsonObject& jsonObj);
    void iamNewFriend(QString id);// 提醒对方服务端，我是新好友，发送我的信息到他的客户端
    void youAreDelete(QString id);// 通知对方，你已经被我删除了
    void friendChangeInfo(QString id);// 通知对方，我的个人信息修改了

private:
    QMutex m_mutex;// 互斥锁
    Server* m_server;//保存Server类对象（用于对哈希表进行操作、获取数据库连接等操作）
    QWebSocket* m_socket;//保存自身的套接字，用于和客户端进行通信
    QString m_id;//保存自身的账号信息
    QSqlDatabase m_db;
};

#endif // CLIENTHANDLER_H
